﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;


namespace AudiPyme.UI
{
    public partial class ControlesGestionar : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    if (EmpresasFactory.MadurezActualEmpresa(IdEmpresa) == 0)
                    {
                        MuestraMensajeRedirige("La empresa no tiene calculado el Nivel de Madurez Actual. Se redirigira a la página para poder calcularlo.", "EmpresaNivMadurezActualGest");
                        PnlGV.Visible = false;
                    }
                    else
                    {
                        ModeloContainer agenteBD = new ModeloContainer();
                        BtnInsertar.Visible = true;
                        //Número de controles seleccionados actualmente
                        int nControlesOn = 0;
                        //Numero de controles que hay actualmente en la BD
                        int numeroControles = 0;
                        IQueryable<Controles> Controles = from Matriz in agenteBD.ControlesEstablecer
                                                          select Matriz;
                        foreach (Controles Control in Controles)
                        {
                            numeroControles++;
                        }
                        //Lista de enteros que almacena que controles han sido seleccionados
                        List<int> Contador = new List<int>(133);
                        //Inicializamos la lista
                        for (int i = 0; i < Contador.Capacity; i++)
                        {
                            Contador.Insert(i, 0);
                        }
                        //Recogemos los controles de la base de datos
                        Session["idEmpresa"] = IdEmpresa;
                        var ValoresControlesEmpresa = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                                      join Contr in agenteBD.ControlesEstablecer on ContrEmp.IdControl equals Contr.IdControl
                                                      where ContrEmp.IdEmpresa == IdEmpresa
                                                      select new { ContrEmp.IdControl, Contr.Codigo, Contr.Nombre, Contr.Descripcion };
                        GVControles.DataSource = ValoresControlesEmpresa;
                        DataBind();

                        IQueryable<String> Valores = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                                     join Contr in agenteBD.ControlesEstablecer on ContrEmp.IdControl equals Contr.IdControl
                                                     where ContrEmp.IdEmpresa == IdEmpresa
                                                     orderby ContrEmp.IdControl
                                                     select ContrEmp.Valor;
                        List<String> ValoresControles = new List<String>();
                        int j = 0;
                        foreach (String Valor in Valores)
                        {
                            ValoresControles.Add(Valor);
                            j++;
                        }
                        int k = 0;
                        IQueryable<int> NivMadContr = from Contr in agenteBD.ControlesEstablecer
                                                      orderby Contr.IdControl
                                                      select Contr.NivelMadurez;
                        List<int> NivMadControl = new List<int>();
                        foreach (int NivMad in NivMadContr)
                        {
                            NivMadControl.Add(NivMad);
                            k++;
                        }
                        //Creamos e inicializamos el control que va a recoger que selección del RadioButtonList se ha hecho
                        //de cada control
                        List<ControlesCheckList> CheckList = new List<ControlesCheckList>(133);
                        for (int i = 0; i < Valores.Count(); i++)
                        {
                            CheckList.Insert(i, new ControlesCheckList(IdEmpresa, (i + 1), ValoresControles[i].Trim(), NivMadControl[i]));
                        }
                        for (int i = 0; i < CheckList.Count; i++)
                        {
                            ControlesCheckList controlLista = CheckList[i];
                            foreach (GridViewRow row in GVControles.Rows)
                            {
                                int IdControl;
                                int.TryParse(GVControles.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                                if (IdControl == controlLista.IdControl)
                                {
                                    RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                                    switch (controlLista.ValorControl)
                                    {
                                        case "SI":
                                            Rbl.Items[0].Selected = true;
                                            break;
                                        case "NO":
                                            Rbl.Items[1].Selected = true;
                                            break;
                                        case "PARC":
                                            Rbl.Items[2].Selected = true;
                                            break;
                                        case "N/A":
                                            Rbl.Items[3].Selected = true;
                                            break;
                                    }
                                }
                            }
                        }
                        //Guardamos en variables de sesión
                        Session["CheckList"] = CheckList;
                        Session["Contador"] = Contador;
                        Session["nControlesOn"] = nControlesOn;
                    }
                }
                else
                {
                    MuestraMensaje("No hay una empresa asociada al usuario");
                    PnlGV.Visible = false;
                }
            }
        }

        //Método que se ejecuta al evento de cliquear una de las opciones del RadioButtonList en cada control
        protected void Index_Changed(Object sender, EventArgs e)
        {
            //Recuperamos las variables de sesión
            //Recogemos el valor de los controles seleccionados en las otras paginas del GridView
            //con la variable de sesión nControlesOn
            String nombreUsuario = (String)Session["nombreUsuario"];
            int IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
            int nControlesOn = (int)Session["nControlesOn"];
            List<int> Contador = (List<int>)Session["Contador"];
            List<ControlesCheckList> CheckList = (List<ControlesCheckList>)Session["Checklist"];
            //Recorremos la página que el gridview muestra
            foreach (GridViewRow row in GVControles.Rows)
            {
                //Recogemos el control RadioButtonList de cada fila del gridview
                RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                //Recogemos el Id del Control de cada fila
                int IdControl;
                int.TryParse(GVControles.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                if (Rbl.SelectedItem != null)
                {
                    //Recogemos el control, el valor seleccionado y el nivel de madurez al que pertenece ese control
                    String Control = GVControles.Rows[row.RowIndex].Cells[4].Text;
                    String ValorSelec = Rbl.SelectedItem.Text;
                    //Creamos el objeto ControlCheckList con los valores y lo insertamos en la lista
                    ModeloContainer agenteBD = new ModeloContainer();
                    int k = 0;
                    IQueryable<int> NivMadContr = from Contr in agenteBD.ControlesEstablecer
                                                  orderby Contr.IdControl
                                                  select Contr.NivelMadurez;
                    List<int> NivMadControl = new List<int>();
                    foreach (int NivMad in NivMadContr)
                    {
                        NivMadControl.Add(NivMad);
                        k++;
                    }
                    int NivelMadurezSelec = NivMadControl[IdControl - 1];
                    ControlesCheckList ControlChequeado = new ControlesCheckList(IdEmpresa, IdControl, ValorSelec, NivelMadurezSelec);
                    CheckList.Insert(IdControl - 1, ControlChequeado);
                    //Eliminamos cualquier ocurrencia antigua del control insertado
                    for (int i = 0; i < CheckList.Count; i++)
                    {
                        if (CheckList[i].IdControl == IdControl && (i != (IdControl - 1)))
                        {
                            CheckList.RemoveAt(i);
                        }
                    }
                }
                //Si es la primera vez que se elige una opción en dicho control, aumentamos el contador
                //y marcamos que ese control ya tiene una opción elegida
                if (Rbl.SelectedItem != null && Contador[IdControl - 1] == 0)
                {
                    Contador[IdControl - 1] = 1;
                    nControlesOn++;
                }
            }
            //Guardamos en la variable de sesión
            Session["nControlesOn"] = nControlesOn;
            //Si están elegidos todos los controles activamos el botón de insertar
            if (nControlesOn == 133)
            {
                BtnInsertar.Enabled = true;
            }
        }

        private void MuestraMensajeRedirige(string Mensaje, string pagina)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            SB.Append("var vers = navigator.appVersion;if(vers.indexOf('MSIE 7.0') != -1) { window.location='"+pagina+".aspx';} else{ window.location='"+pagina+".aspx'; }");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        protected void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "showalert", SB.ToString(), true);
        }

        private int DatosEmpresa()
        {
            int IdEmpresa = -1;
            String nombreUsuario = (String)Session["nombreUsuario"];
            if (String.IsNullOrEmpty(nombreUsuario))
            {
                MuestraMensaje("No se pudo encontrar el usuario");
                return -1;
            }
            else
            {
                IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
                if (IdEmpresa == 0)
                {
                    MuestraMensaje("El usuario " + nombreUsuario + " no esta asociado a una empresa");
                    return -1;
                }
                else
                {
                    return IdEmpresa;
                }
            }
        }

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
            ModeloContainer agenteBD = new ModeloContainer();
            String nombreUsuario = (String)Session["nombreUsuario"];
            int IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
            //Recogemos la lista que contiene que controles han sido elegidos 
            List<int> Contador = (List<int>)Session["Contador"];
            ArrayList valores = new ArrayList();
            //Recogemos la lista con el valor de los controles que han sido elegidos
            List<ControlesCheckList> CheckList = (List<ControlesCheckList>)Session["Checklist"];
            //Recorremos el Gridview antes de cambiar de página
            foreach (GridViewRow row in GVControles.Rows)
            {
                //Recogemos el control RadioButtonList de cada fila
                RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                //Si está seleccionado
                if (Rbl.SelectedItem != null)
                {
                    //Recogemos el IdControl de la fila
                    int IdControl;
                    int.TryParse(GVControles.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                    //Actualizamos el valor de contador
                    Contador[IdControl - 1] = 1;
                    //Recogemos el control, el valor seleccionado y el nivel de madurez al que pertenece ese control
                    String Control = GVControles.Rows[row.RowIndex].Cells[4].Text;
                    String ValorSelec = Rbl.SelectedItem.Text;
                    //Creamos el objeto ControlCheckList con los valores y lo insertamos en la lista

                    int k = 0;
                    IQueryable<int> NivMadContr = from Contr in agenteBD.ControlesEstablecer
                                                  orderby Contr.IdControl
                                                  select Contr.NivelMadurez;
                    List<int> NivMadControl = new List<int>();
                    foreach (int NivMad in NivMadContr)
                    {
                        NivMadControl.Add(NivMad);
                        k++;
                    }
                    int NivelMadurezSelec = NivMadControl[IdControl - 1];
                    ControlesCheckList ControlChequeado = new ControlesCheckList(IdEmpresa, IdControl, ValorSelec, NivelMadurezSelec);
                    CheckList.Insert(IdControl - 1, ControlChequeado);
                    //Eliminamos cualquier ocurrencia antigua del control insertado
                    for (int i = 0; i < CheckList.Count; i++)
                    {
                        if (CheckList[i].IdControl == IdControl && (i != (IdControl - 1)))
                        {
                            CheckList.RemoveAt(i);
                        }
                    }
                }
            }
            //Actualizamos la variable de sesión
            Session["Contador"] = Contador;
            //Pasamos a la nueva página que se ha seleccionado
            this.GVControles.PageIndex = e.NewPageIndex;
            Session["CheckList"] = CheckList;
            //Recuperamos los controles asociados a esa página seleccionada
            var ValoresControlesEmpresa = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                          join Contr in agenteBD.ControlesEstablecer on ContrEmp.IdControl equals Contr.IdControl
                                          where ContrEmp.IdEmpresa == IdEmpresa
                                          select new { ContrEmp.IdControl, Contr.Codigo, Contr.Nombre, Contr.Descripcion };
            GVControles.DataSource = ValoresControlesEmpresa;
            DataBind();
            //Cargamos el valor de los controles que estuvieran seleccionados anteriormente
            for (int i = 0; i < CheckList.Count; i++)
            {
                ControlesCheckList controlLista = CheckList[i];
                foreach (GridViewRow row in GVControles.Rows)
                {
                    int IdControl;
                    int.TryParse(GVControles.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                    if (IdControl == controlLista.IdControl)
                    {
                        RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                        switch (controlLista.ValorControl)
                        {
                            case "SI":
                                Rbl.Items[0].Selected = true;
                                break;
                            case "NO":
                                Rbl.Items[1].Selected = true;
                                break;
                            case "PARC":
                                Rbl.Items[2].Selected = true;
                                break;
                            case "N/A":
                                Rbl.Items[3].Selected = true;
                                break;
                        }
                    }
                }
            }
            }
            catch (Exception e1)
            {
                MuestraMensaje("Error en el Evento PageIndexChanguing. "+e1.Message);
            }
        }

        protected void BtnInsertar_Click(object sender, EventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                List<ControlesCheckList> CheckList = (List<ControlesCheckList>)Session["Checklist"];
                ModeloContainer agenteBD = new ModeloContainer();
                IQueryable<ControlesEmpresa> ValoresControlesEmpresa = from CtrEmp in agenteBD.ControlesEmpresaEstablecer
                                                                       where CtrEmp.IdEmpresa == IdEmpresa
                                                                       select CtrEmp;
                int contador = 0;

                foreach (ControlesEmpresa ControlEmp in ValoresControlesEmpresa)
                {
                    ControlEmp.Valor = CheckList[contador].ValorControl;
                    contador++;
                }
                agenteBD.SaveChanges();

                //Calculamos el Nivel de Madurez con los cambios establecidos en los controles
                int NivelMadurezActualCalculada = EmpresasFactory.CalcularNivelMadurezActualEmpresa(CheckList, IdEmpresa);
                //Recogemos el nivel de Madurez Actual Reciente de la empresa
                int NivelRecienteMadurezActual = EmpresasFactory.MadurezActualEmpresa(IdEmpresa);
                if (NivelRecienteMadurezActual == 0)
                {
                    MuestraMensaje("No se pudo recuperar el Nivel de Madurez Actual de la Empresa");
                }
                else
                {
                    //Si el cambio de los controles ha hecho que haya un cambio en el Nivel de Madurez Actual 
                    //se actualiza la tabla Empresa con el Nivel de Madurez Actual Nuevo
                    if (NivelMadurezActualCalculada != NivelRecienteMadurezActual)
                    {
                        EmpresasFactory.InsertarNivelMadurezActual(IdEmpresa, NivelMadurezActualCalculada);
                        MuestraMensaje("El Control ha sido actualizado correctamente. Debido a esta modificación el Nivel de Madurez Actual es " + NivelMadurezActualCalculada.ToString());
                    }
                    //Si no, sólo mostramos que la actualización de controles ha sido la correcta
                    else
                    {
                        MuestraMensaje("El Control ha sido actualizado correctamente.");
                    }
                }
            }
            else
            {
                MuestraMensaje("La actualización no pudo llevarse a cabo. Fallo al actualizar!");
            }
        }
    }

}